/*
 * IndiceDatos.h
 *
 *  Created on: May 20, 2012
 *      Author: lucasj
 */

// Indice Datos:
// Contiene los datos leidos del archivo datos. Se
// guardan de la forma: cod y un string con la línea
// del archivo.

#ifndef INDICEDATOS_H_
#define INDICEDATOS_H_

#include "IndiceDimensiones.h"
#include "IndiceColumna.h"
#include "IndiceAgregacion.h"
#include "Consulta.h"
#include "ValoresAgregaciones.h"
#include <iostream>

typedef std::map<int, std::string>::iterator iteratorDatos;
typedef std::list<int>::iterator iteratorListaResultado;

namespace DataIndex {

class IndiceDatos {
private:
	DimensionIndex::IndiceDimensiones dimension;
	ColumnIndex::IndiceColumna columna;
	std::map<int, std::string> map;
	int obtenerValor(int posIndice, int posHecho);
	bool LlenarResultado(Consulta& pregunta,
			ResultIndex::IndiceResultado& resultIndex, int &cantValores, Consulta& hechos);
	void obtenerSiguientePosicion(unsigned int
					    &posAnterior, unsigned int &posActual, std::string &linea);
	void ImprimirResultados(ResultIndex::IndiceResultado& coincidencias, std::ostringstream &res);
	void Agregar(ResultIndex::IndiceResultado& coincidencias, Consulta& hechos, std::ostringstream& res);
	void AgregarCoincidencias(ResultIndex::IndiceResultado& coincidencias, AggregationIndex::IndiceAgregacion& res, unsigned int posHecho, char agregacion);
	void Sumar(int& valor, int& otroValor);
	void Max(int& valor, int& otroValor);
	void Min(int& valor, int& otroValor);
	void Count(int& valor);
	void recorrerYBuscar(std::list<std::string>& lista, ResultIndex::IndiceResultado& resultIndex, int pos);
	void AgregarSinNone(
			std::list<Atributo_consulta*>& lista,
			ResultIndex::IndiceResultado& coincidencias,
			AggregationIndex::IndiceAgregacion& resAgg);
	void ImprimirCoincidencias(std::list<Atributo_consulta*>& lista, ResultIndex::IndiceResultado& coincidencias, std::ostringstream& res);
	int obtenerPosicionDimension(int posIndice, std::string& valorActual);
public:
	IndiceDatos(Validador& validator);
	virtual ~IndiceDatos();
	void SetElem(std::string &linea, int cod);
	void Consultar(Consulta& pregunta, std::ostringstream &res);
	void obtenerValorColumna(Consulta& pregunta, std::ostringstream &res);
	friend std::ostringstream& operator<<(std::ostringstream& oss,
					  IndiceDatos &indice);
};
std::ostringstream& operator<<(std::ostringstream& oss, IndiceDatos &indice);
}
#endif
